from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba


def dict_demo():
    """
    字典特征提取
    :return:
    """
    data = [
        {'city': '北京', 'temperature': 28},
        {'city': '上海', 'temperature': 31},
        {'city': '广州', 'temperature': 29}
    ]
    # 实例化一个转换器类
    dict_transformer = DictVectorizer(sparse=False)

    # 调用fit_transform
    data_new = dict_transformer.fit_transform(data)
    print(f"输出data_new：\n{data_new}")
    # print(f"输出data_new的属性：\n{data_new.toarray()}")
    print(f"特征名字：\n{dict_transformer.get_feature_names_out()}")


def text_english_demo():
    """
    文本特征提取
    :return:
    """
    data = ["I love Zheng Yuanyuan,shi is beautiful. But i do not know how to express my love"]
    # 实例化一个转换器类
    vectorizer = CountVectorizer()
    # 调用fit_transform
    # fit() 方法仅学习词汇表（即分析 data 中的所有单词，生成词到索引的映射），但不会转换数据。
    vectorizer.fit(data)
    # 通常，CountVectorizer 会直接使用 fit_transform() 一步完成学习+转换：
    data_new = vectorizer.fit_transform(data)
    data_new = data_new.toarray()
    print(f"输出data_new：\n{data_new}")

    print(vectorizer.vocabulary_)
    # print(f"特征名字：\n{vectorizer.get_feature_names_out()}")


def text_chinese_demo():
    """
    文本特征提取
    :return:
    """
    data = ["我喜欢zyy，但是不知道怎么表达心意"]
    # 实例化一个转换器类
    vectorizer = CountVectorizer()
    # 调用fit_transform
    # fit() 方法仅学习词汇表（即分析 data 中的所有单词，生成词到索引的映射），但不会转换数据。
    vectorizer.fit(data)
    # 通常，CountVectorizer 会直接使用 fit_transform() 一步完成学习+转换：
    data_new = vectorizer.fit_transform(data)
    data_new = data_new.toarray()
    print(f"输出data_new：\n{data_new}")
    print(f"特征名字：\n{vectorizer.get_feature_names_out()}")

    print(f"输出构建词汇表：\n{vectorizer.vocabulary_}")


def text_chinese_demo2():
    """
    中文文本特征提取，自动抽取
    :return:
    """
    # 将中文文本进行分词
    data = [
        "我喜欢zyy，但是不知道怎么表达心意",
        "我喜欢zyy很久了，但一直不知道该怎么表达心意",
        "其实我喜欢zyy，可是不知道她怎么想",
        "我对zyy有好感，但不确定如何恰当地表达心意",
        "朋友说：‘你喜欢zyy就告诉她啊！’可我还是犹豫",
        "喜欢zyy却不敢说，怕连朋友都做不成",
        "每次见到zyy都很开心，但就是开不了口",
        "写好了给zyy的表白消息，却迟迟不敢发送"
    ]
    data_new = []
    for text in data:
        data_new.append(cut_text(text))
    # print(data_new)
    # 实例化一个转换器类
    vectorizer = CountVectorizer()
    # 调用fit_transform
    # fit() 方法仅学习词汇表（即分析 data 中的所有单词，生成词到索引的映射），但不会转换数据。
    vectorizer.fit(data_new)
    # 通常，CountVectorizer 会直接使用 fit_transform() 一步完成学习+转换：
    data_final = vectorizer.fit_transform(data_new)
    data_final = data_final.toarray()
    print(f"输出data_final：\n{data_final}")
    print(f"特征名字：\n{vectorizer.get_feature_names_out()}")

    print(f"输出构建词汇表：\n{vectorizer.vocabulary_}")


def cut_text(text):
    return ' '.join(list(jieba.cut(text)))


def tfidf_demo():
    """
    用tfidf进行文本特征抽取
    :return:
    """
    # 将中文文本进行分词
    data = [
        "我喜欢zyy，但是不知道怎么表达心意",
        "我喜欢zyy很久了，但一直不知道该怎么表达心意",
        "其实我喜欢zyy，可是不知道她怎么想",
        "我对zyy有好感，但不确定如何恰当地表达心意",
        "朋友说：‘你喜欢zyy就告诉她啊！’可我还是犹豫",
        "喜欢zyy却不敢说，怕连朋友都做不成",
        "每次见到zyy都很开心，但就是开不了口",
        "写好了给zyy的表白消息，却迟迟不敢发送"
    ]
    data_new = []
    for text in data:
        data_new.append(cut_text(text))
    # print(data_new)
    # 实例化一个转换器类
    vectorizer = TfidfVectorizer()
    # 调用fit_transform
    # fit() 方法仅学习词汇表（即分析 data 中的所有单词，生成词到索引的映射），但不会转换数据。
    vectorizer.fit(data_new)
    # 通常，CountVectorizer 会直接使用 fit_transform() 一步完成学习+转换：
    data_final = vectorizer.fit_transform(data_new)
    data_final = data_final.toarray()
    print(f"输出data_final：\n{data_final}")
    print(f"特征名字：\n{vectorizer.get_feature_names_out()}")

    print(f"输出构建词汇表：\n{vectorizer.vocabulary_}")


if __name__ == '__main__':
    # dict_demo()
    # text_english_demo()
    # text_chinese_demo()
    # text_chinese_demo2()
    tfidf_demo()
